/*
 * Copyright (c) 2023-2025 elsfs Authors. All Rights Reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.elsfs.cloud.common.mybatis.ext.db;

import com.baomidou.mybatisplus.core.metadata.IPage;
import java.util.Collection;
import java.util.List;
import java.util.Map;

/** SQL执行器 */
public interface GenericSqlExecutor {

  /**
   * 查询单条数据
   *
   * @param sql SQL
   * @param clazz 结果类
   * @return 结果
   * @param <T> 结果类型
   */
  <T> T selectOne(String sql, Class<T> clazz);

  /**
   * 查询单条数据
   *
   * @param sql SQL
   * @param parameters SQL参数
   * @param clazz 结果类
   * @return 结果
   * @param <T> 结果类型
   */
  <T> T selectOne(String sql, Map<String, Object> parameters, Class<T> clazz);

  /**
   * 查询列表数据
   *
   * @param sql SQL
   * @param clazz 结果类
   * @return 结果
   * @param <T> 结果类型
   */
  <T> List<T> selectList(String sql, Class<T> clazz);

  /**
   * 查询列表数据
   *
   * @param sql SQL
   * @param parameters SQL参数
   * @param clazz 结果类
   * @return 结果
   * @param <T> 结果类型
   */
  <T> List<T> selectList(String sql, Map<String, Object> parameters, Class<T> clazz);

  /**
   * 查询分页数据
   *
   * @param sql SQL
   * @param page 分页对象
   * @param clazz 结果类
   * @return 结果
   * @param <T> 结果类型
   */
  <T> IPage<T> selectPage(String sql, IPage<T> page, Class<T> clazz);

  /**
   * 查询分页数据
   *
   * @param sql SQL
   * @param parameters SQL参数
   * @param page 分页对象
   * @param clazz 结果类
   * @return 结果
   * @param <T> 结果类型
   */
  <T> IPage<T> selectPage(
      String sql, IPage<T> page, Map<String, Object> parameters, Class<T> clazz);

  /**
   * 查询列表数据，并根据其中一个字段转为Map
   *
   * @param sql SQL
   * @param mapKeyField Map键对应的字段名称
   * @param clazz 结果类
   * @return 结果
   * @param <T> 结果类型
   */
  <T> Map<String, T> selectMap(String sql, String mapKeyField, Class<T> clazz);

  /**
   * 查询列表数据，并根据其中一个字段转为Map
   *
   * @param sql SQL
   * @param parameters SQL参数
   * @param mapKeyField Map键对应的字段名称
   * @param clazz 结果类
   * @return 结果
   * @param <T> 结果类型
   */
  <T> Map<String, T> selectMap(
      String sql, Map<String, Object> parameters, String mapKeyField, Class<T> clazz);

  /**
   * 插入数据
   *
   * @param sql SQL
   * @return 影响行数
   */
  int insert(String sql);

  /**
   * 插入数据
   *
   * @param sql SQL
   * @param parameters SQL参数
   * @return 影响行数
   */
  int insert(String sql, Map<String, Object> parameters);

  /**
   * 批量插入
   *
   * @param sql SQL
   * @param parameterMaps SQL参数集合
   */
  void batchInsert(String sql, Collection<Map<String, Object>> parameterMaps);

  /**
   * 更新数据
   *
   * @param sql SQL
   * @return 影响行数
   */
  int update(String sql);

  /**
   * 更新数据
   *
   * @param sql SQL
   * @param parameters SQL参数
   * @return 影响行数
   */
  int update(String sql, Map<String, Object> parameters);

  /**
   * 批量更新
   *
   * @param sql SQL
   * @param parameterMaps SQL参数集合
   */
  void batchUpdate(String sql, Collection<Map<String, Object>> parameterMaps);

  /**
   * 删除数据
   *
   * @param sql SQL
   * @return 影响行数
   */
  int delete(String sql);

  /**
   * 删除数据
   *
   * @param sql SQL
   * @param parameters SQL参数
   * @return 影响行数
   */
  int delete(String sql, Map<String, Object> parameters);

  /**
   * 批量删除
   *
   * @param sql SQL
   * @param parameterMaps SQL参数集合
   */
  void batchDelete(String sql, Collection<Map<String, Object>> parameterMaps);
}
